<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /*
            ①确定递推数组和下标含义
            dp[i]表示拆分数字i，得到的最大乘积为dp[i]
            ②递推公式
            dp[i]的乘积如何能确定最大。
            定义一个j从1开始遍历
            dp[i]有两种情况  一种是i*(i-j) 另外一种是 i*dp[i-j] 即将i-j再次拆分
            dp[i]=Math.max(i*(i-j),i*dp[i-j])
            也可以这么理解，j * (i - j) 是单纯的把整数拆分为两个数相乘，而j * dp[i - j]是拆分成两个以及两个以上的个数相乘。

            注意：为了保证最后的结果最大，所以循环遍历j的时候，需要保证当前i下的最大值
            dp[i]=Math.max(dp[i],i*(i-j)，i*dp[i-j])

            ③初始化dp数组
            一维初始化 dp[0]=0 dp[1]=0  dp[2]=1
            ④确定遍历顺序
            因为当前状态依赖于前面状态 所以从左往右遍历


            */
      var integerBreak = function (n) {
        let dp = new Array(n + 1).fill(0)
        dp[2] = 1
        for (let i = 3; i < dp.length; i++) {
          for (let j = 1; j < i; j++) {
            dp[i] = Math.max(dp[i], j * (i - j), dp[i - j] * j)
          }
        }
        return dp[n]
      }
      console.log(integerBreak(10))
    </script>
  </body>
</html>
